Java、JDKをインストールせずに使ったり捨てたり


概要

ろくなアンインストーラが無い上にあなたとJavaインストーラは変な挙動するので本当にJavaインストールしたくない。

結論として、あなたとJavaを見ずにJavaをそのへんに入れたり捨てたりが容易にできるようになった。


なので正しい題としては、「あなたとJavaを見ずにJavaをそのへんのフォルダにインストールする」になる。



ある程度の経緯

ホストマシン(Mac)にJavaをインストールすると通知とか管理が本当にウザいので、

JDKをDocker側に入れてホストマシンからはそれを使うようにしたい。という感じで考えていた。

Dockerをつかってどうこうするのはまあよく考えたら無理で、代替を探していろいろやった話。

そのうちもっとちゃんと隔離したい。



今回の用途、Dockerだとなぜ適さなかったのか

Dockerの-vでのボリュームだと、

・Macの特定のフォルダ以下のパスを

・Dockerのコンテナの特定のフォルダに接続する


ということをしていて、まあ、想定されているアクセス方向としては


アクセス方向 -> 

Docker(

特定path -> 

Mac(

特定path

)

)


という、「DockerからMacの特定パスにアクセスできる」という機能なわけで、

今回自分が欲しかったのは下記。


アクセス方向 -> 

Mac(

特定path -> 

Docker(

特定path(ここにJava入れて云々)

)

)


で、まあ、これはDockerコンテナの仕事ではなく、ホストOSに対するパーティショニングみたいな概念で、

そもそもDockerじゃなくてもいいじゃんみたいな感じに落ち着いた。Javaまわりいろいろ多いので、できれば隔離したかった。


戦略としては、

・Macの特定フォルダ以下にJDKが入ったフォルダを置く

だけ。


まずJDKインストーラを分解します

できればOracleのサイトから何かDLするのすらやりたくなかったんだけど、

こればっかりはしょうがないのでOracleのサイトからJDKのインストーラをDLしてくる。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html



dmgしかない。ここにtarなどがあればここからの苦労は本当に必要ない。ちなみにJREはtarで配布されてる。なぜなの。



分解工程

まずはどこでもいいので、tmpフォルダを用意して、その中にJDKのインストーラを分解したものを出力

mkdir tmp

この状態で、DLしてきたJDKのdmgをダブルクリックし、/Volumeでアクセスできるようにする。

スクリーンショット 2016-12-05 19.59.28.png


デスクトップにこういうのが表示された状態で、packageutilを使ってインストーラの中身をtmp内に展開する。


cd tmp

pkgutil --expand  /Volumes/JDK\ 8\ Update\ 111/JDK\ 8\ Update\ 111.pkg ./jdkpkg


これで、JDKの中身がtmpフォルダに展開される。

スクリーンショット 2016-12-05 20.02.46.png

さらにpkgが出てきたので分解する。

javaappletまだ積んでるのか。そちらは要らないので無視する。


jdk180111.pkgを分解する。


なんでpkgからpkg出てくるんだろ?っていう疑念は当たりで、このpkgに対してpkgutilを使うと失敗する。

で、

これは拡張子はpkgなんだけどどうやらpkgではないという。なにしてんの。


いろいろ探してたら先駆者がいた。先駆者の人たちどんな気持ちでこのテクニックにたどり着いたんだろう。


How to install java 7 on mac in custom location?

http://stackoverflow.com/questions/15217200/how-to-install-java-7-on-mac-in-custom-location

というわけで、このpkgはこれ、pkgではなくGZipされたCPIOファイルだそうで。へぇ。なんで.pkgなんだ、、、


cpio -i < ./jdkpkg/jdk180111.pkg/Payload



やったぜ。

スクリーンショット 2016-12-05 20.40.41.png



無事javaがそのへんに置けましたね。よかったよかった。

これでおもしろインストーラを一切実行せずに、ホスト環境を汚されずに済む。そして捨てやすい。



使い方

いちいち下記をやってもいいし、

export JAVA_HOME=どこか/tmp/Contents/Home/


bashrcとかをいじってもいいと思う。

自分は必要な時だけ必要なので、これでいい。



動くの?

動くよ。

スクリーンショット 2016-12-05 21.14.00.png



注意点

extractしたHomeディレクトリの奥深くに、Java Mission Control.appというAppが入っているので、

使わない場合は消せばいいと思う。

スクリーンショット 2016-12-14 3.43.35.png

自分は存在に気づかなかったが確かにあって、用途を鑑みるにろくでもないものをインストールしそうだったので消した。